﻿using System;
using System.Collections.Generic;

namespace HeroDream
{

    //定义委托 ：访问修饰符 关键字 方法（返回值 方法名（形参1，形参2））
    //定义带参数的委托
    public delegate void SelfAction(int value);

    //定义带返回值的委托
    public delegate string Function(int value);

    /// <summary>
    ///   定义一个学生类，类里有一个学生姓名变量和学生电话后四位信息。
    ///   分别对变量定义属性。 定义取外卖的方法，输出xxx去取外卖了
    ///    定义领取到外卖方法，输出*** 的外卖已取到, 在主函数里调用
    /// </summary>
    class Student
    {


        //无返回值的委托
      //  public SelfAction a;

        //不带返回值的委托，无参数
        public Action action2;

        //泛型委托
        //不带返回值的委托，有两个参数
        public Action<int,int> action1;

        //有返回值的委托,泛型委托
        //用<>把参数和返回值包括在里，其中多个的话，最后一个数据类型为返回值数据类型。
        public Func<int,int,int> func;


        public List<int> list = new List<int>();

        public void DoHandle(Action<int> action)
        {
            Console.WriteLine($"热心人{Name}正在帮忙");
            action(PhoneNumber);
            action1 = Fa;
            func = Fb;
            action1.Invoke(12,5);
            int sum = func(12, 5);
         }


        public int Fb(int a,int b)
        {
            return a+b;
        }

        public void Fa(int a,int b)
        {
            Console.WriteLine(a + b);
        }

        Func<int,string> function;//记住自己该做什么事情

        /// <summary>
        /// 接受委托
        /// </summary>
        /// <param name="doSomeThing"></param>
        public void Tell(Func<int, string> doSomeThing)
        {
            if (function == null)
            {
                function = doSomeThing;
            }
            else
            {
                function += doSomeThing;
            }
        }

        //自己去拿外卖
        public void GetTakonOut()
        {
            Console.WriteLine($"尾号为{PhoneNumber}的同学去取外卖了");
            Takes(phoneNumber);
            //帮别人拿别人的
            //触发委托
            string otherName=function(phoneNumber);
            Console.WriteLine($"{otherName}对你表示感谢");
        }


        private string name;

        private int phoneNumber;

        //属性
        public string Name
        {
           get { return name; }
            set { name = value; }
        }
        public int PhoneNumber
        {
            get { return phoneNumber; }
            set { phoneNumber = value; }
        }

        public Student(string name,int number)
        {
            Name = name;
            PhoneNumber = number;
        }
      
        /// <summary>
        /// 取外卖的方法
        /// </summary>
        public string Takes(int number)
        {
            Console.WriteLine($"尾号为{number}的同学把{Name}的外卖领取了");
            return Name;
        }

        public string GetWater(int number)
        {
            Console.WriteLine($"尾号为{number}的同学帮{Name}买了一瓶水");
            return Name;
        }

        public static void Test()
        {
            Student student1 = new Student("张三", 1122);
            Student student2 = new Student("李四", 5555);
            Student student3 = new Student("王二", 6666);

            Func<int, string> handle1 = student1.Takes;
            Func<int, string> handle2 = student3.Takes;
            Func<int, string> handle3 = student1.GetWater;

            student2.Tell(handle1);

            student2.Tell(handle2);

            student2.Tell(handle3);

            student2.GetTakonOut();
        }
    }
}
